home *** CD-ROM | disk | FTP | other *** search
- .386p
- ;
- VRAM_SEL equ 0120h
- VRAM_OFF equ 0200h
- L_LINE equ 0
- TAB equ 9
- CRLF equ 0A0Dh
- CR equ 0Dh
- LF equ 0Ah
- ON equ 1
- OFF equ 0
- NULL equ 0
- TAB_W equ 3
- ;
- public add_ebx
- public add_edi
- public tab_wide
- public r_line
- public max_str
- public l_count_1
- public l_count_2
- public cr_disp
- extrn col_ank_tbl:word
- extrn col_kan_tbl:word
- extrn fnt_ank_tbl:dword
- extrn fnt_kan_tbl:dword
- extrn off_adr_tbl:dword
- ;
- data segment dword 'DATA' use32
- ;
- align 4
- extrn max_line:dword
- extrn pointer:dword
- extrn filesize:dword
- cr_disp db ON
- align 4
- add_ebx dd 4, 3, 2, 1, 0, 0, 0, 0
- add_edi dd 12, 9, 6, 3, 0, 0, 0, 0
- tab_wide dd 3
- r_line dd 328/2
- max_str dd 52
- l_count_1 dd 39
- l_count_2 dd 512-156
- back_ground dd 92 dup( 0cccccccch )
- jmp_tbl_1 dd ank_ok_1, chk_kan_1
- jmp_tbl_2 dd ank_ok_1, kan_ok_1
- jmp_tbl_3 dd ank_ok_2, chk_kan_2
- jmp_tbl_4 dd ank_ok_2, kan_ok_2
- jmp_tbl_5 dd ank_ok_3, chk_kan_3
- jmp_tbl_6 dd ank_ok_3, kan_ok_3
- ;
- cr_mark dd 0ccaccccch, 0cccccccch, 0ccccccach, 0ccaccccch
- dd 0cccccccch, 0ccccccach, 0ccaccccch, 0cccccccch
- dd 0ccccccach, 0ccaccccch, 0cccccccch, 0ccccccach
- dd 0ccaccccch, 0accccccch, 0ccccacach, 0caaacccch
- dd 0cccccccch, 0ccccccach
- ; +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
- chk_tbl_1 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
- db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
- db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
- db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- ; +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
- chk_tbl_2 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
- db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
- db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
- db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0
- db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
- db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
- db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
- db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
- db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
- db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
- db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
- db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0
- fnt_ank dw 2*16 dup(?)
- fnt_kan dd 256 dup(?)
- data ends
- ;
- code segment dword public 'CODE' use32
- assume cs:code, ds:data
- ;----------------------------------------------------------
- ; void set_color( void );
- ;----------------------------------------------------------
- public set_color
- db 'set_color', 9
- set_color proc near
- push edi
- push esi
- ;--- テキストカラーを決定する ---
- ;--- ANKカラーコードを決定 ---
- mov esi, offset fnt_ank_tbl
- mov edi, offset fnt_ank
- xor eax, eax
- mov ecx, 16
- loop_01:
- lodsw
- mov edx, eax
- not edx
- and eax, 0bbbbh
- and edx, 0cccch
- or eax, edx
- stosw
- loop short loop_01
- ;--- 漢字カラーコードを決定 ---
- mov esi, offset fnt_kan_tbl
- mov edi, offset fnt_kan
- mov ecx, 256
- loop_02:
- lodsd
- mov edx, eax
- not edx
- and eax, 0bbbbbbbbh
- and edx, 0cccccccch
- or eax, edx
- stosd
- loop short loop_02
- pop esi
- pop edi
- ret
- set_color endp
- ;----------------------------------------------------------
- ; call_text( char *strptn, char *text, int now_line );
- ;----------------------------------------------------------
- public call_text
- db 'call_text', 9
- call_text proc near
- push ebp
- mov ebp, esp
- push ebx
- push edi
- push esi
- push es
- mov ax, VRAM_SEL
- mov es, ax
- ;--- 画面を背景色でクリアする ---
- mov eax, 0cccccccch
- mov ecx, 128*512
- xor edi, edi
- loop_00:
- stosd
- loop short loop_00
- ;--- ファイルサイズが 0だったらジャンプ
- cmp filesize, 0
- je end_1
- mov esi, [ebp+12]
- mov eax, [ebp+16]
- mov ebx, pointer
- mov ecx, [ebx+eax*4]
- xor ebx, ebx
- xor edx, edx
- xor edi, edi
- loop_05:
- push edi
- loop_03:
- mov ax, [esi+ecx]
- ;--- TABのチェック ---
- cmp al, TAB
- je tab_rtn_1
- ;--- CR・LFのチェック ---
- cmp ax, CRLF
- je crlf_rtn_1
- ;--- 1バイト目の漢字のチェック ---
- and eax, 0ffh
- mov al, chk_tbl_1+eax
- jmp short [offset jmp_tbl_1+eax*4]
- ;--- ANK文字表示 ---
- ank_ok_1:
- mov al, [esi+ecx]
- call put_ank
- inc ebx
- inc ecx
- jmp_03:
- ;--- 1行の文字数チェック ---
- cmp ebx, max_str
- jb short loop_03
- jmp_05:
- ;--- 行数のチェック ---
- pop edi
- inc edx
- cmp edx, max_line
- je end_1
- cmp edx, 81
- je end_1
- ;--- テキストポインタを次に進める
- inc word ptr [ebp+16]
- mov eax, [ebp+16]
- mov ebx, pointer
- mov ecx, [ebx+eax*4]
- xor ebx, ebx
- ;--- 文字書き込み番地を生成する ---
- cmp edx, 40
- je short jmp_06
- add edi, VRAM_OFF*12
- jmp short loop_05
- jmp_06:
- mov edi, r_line
- jmp short loop_05
- ;--- 2バイト目の漢字のチェック ---
- chk_kan_1:
- mov al, [esi+ecx+1]
- mov al, chk_tbl_2+eax
- jmp short [offset jmp_tbl_2+eax*4]
- ;--- 漢字表示 ---
- kan_ok_1:
- ;--- 表示数チェック ---
- mov eax, max_str
- dec eax
- cmp ebx, eax
- jae short jmp_05
- mov ax, word ptr [esi+ecx]
- call put_kan
- add ebx, 2
- add ecx, 2
- jmp short jmp_03
- ;--- TAB処理 ---
- tab_rtn_1:
- mov eax, ebx
- and eax, tab_wide
- add ebx, add_ebx+eax*4
- add edi, add_edi+eax*4
- inc ecx
- jmp jmp_03
- ;--- CRLF処理 ---
- crlf_rtn_1:
- cmp cr_disp, OFF
- je jmp_05
- ;--- check letter length
- mov eax, max_str
- dec eax
- cmp ebx, eax
- jae jmp_05
- ;--- put CR mark
- mov eax, 0ab81h
- call put_cr_mark
- jmp jmp_05
- ;--- 終了 ---
- end_1:
- pop es
- pop esi
- pop edi
- pop ebx
- pop ebp
- ret
- call_text endp
- ;-----------------------------------------------------------------------------
- ; put_next_words( char *strptn, char *text, int off_address, int now_line );
- ;-----------------------------------------------------------------------------
- align 4
- public put_next_words
- db 'put_next_words', 14
- put_next_words proc near
- push ebp
- mov ebp, esp
- push ebx
- push edi
- push esi
- push es
- mov ax, VRAM_SEL
- mov es, ax
- mov eax, dword ptr [ebp+16]
- and eax, 0ffffff80h
- shl eax, 2
- add eax, 512*480
- add eax, r_line
- and eax, 03ffffh
- mov edi, eax
- ;--- 事前に行を背景色クリアする ---
- cld
- mov ebx, 12
- loop_10:
- mov esi, offset back_ground
- mov ecx, l_count_1
- rep movsd
- add edi, l_count_2
- and edi, 03ffffh
- dec ebx
- jne short loop_10
- mov edi, eax
- mov eax, [ebp+20]
- mov ebx, pointer
- mov ecx, [ebx+eax*4]
- mov esi, dword ptr [ebp+12]
- xor ebx, ebx
- loop_13:
- mov ax, [esi+ecx]
- ;--- TABのチェック ---
- cmp al, TAB
- je tab_rtn_2
- ;--- CR・LFのチェック ---
- cmp ax, CRLF
- je crlf_rtn_2
- ;--- 1バイト目の漢字のチェック ---
- and eax, 0ffh
- mov al, chk_tbl_1+eax
- jmp short [offset jmp_tbl_3+eax*4]
- ;--- ANK文字表示 ---
- ank_ok_2:
- mov al, [esi+ecx]
- call put_ank
- inc ebx
- inc ecx
- jmp_13:
- ;--- 1行の文字数チェック ---
- cmp ebx, max_str
- jb short loop_13
- jmp_11:
- pop es
- pop esi
- pop edi
- pop ebx
- pop ebp
- ret
- ;--- 2バイト目の漢字のチェック ---
- chk_kan_2:
- mov al, [esi+ecx+1]
- mov al, chk_tbl_2+eax
- jmp short [offset jmp_tbl_4+eax*4]
- ;--- 漢字表示 ---
- kan_ok_2:
- ;--- 表示数チェック ---
- mov eax, max_str
- dec eax
- cmp ebx, eax
- jae short jmp_11
- mov ax, word ptr [esi+ecx]
- call put_kan
- add ebx, 2
- add ecx, 2
- jmp jmp_13
- ;--- TAB処理 ---
- tab_rtn_2:
- mov eax, ebx
- and eax, tab_wide
- add ebx, add_ebx+eax*4
- add edi, add_edi+eax*4
- inc ecx
- jmp jmp_13
- ;--- CRLF処理 ---
- crlf_rtn_2:
- cmp cr_disp, OFF
- je jmp_11
- ;--- check letter length
- mov eax, max_str
- dec eax
- cmp ebx, eax
- jae jmp_11
- ;--- put CR mark
- mov eax, 0ab81h
- call put_cr_mark
- jmp jmp_11
- put_next_words endp
- ;-----------------------------------------------------------------------------
- ; put_back_words( char *strptn, char *text, int off_address, int now_line );
- ;-----------------------------------------------------------------------------
- align 4
- public put_back_words
- db 'put_back_words', 14
- put_back_words proc near
- push ebp
- mov ebp, esp
- push ebx
- push edi
- push esi
- push es
- mov ax, VRAM_SEL
- mov es, ax
- mov eax, dword ptr [ebp+16]
- and eax, 0ffffff80h
- shl eax, 2
- add eax, 512*500
- and eax, 03ffffh
- mov edi, eax
- ;--- 事前に行を背景色クリアする ---
- cld
- mov ebx, 12
- loop_20:
- mov esi, offset back_ground
- mov ecx, l_count_1
- rep movsd
- add edi, l_count_2
- and edi, 03ffffh
- dec ebx
- jne short loop_20
- mov edi, eax
- mov eax, [ebp+20]
- sub eax, 80
- mov ebx, pointer
- mov ecx, [ebx+eax*4]
- mov esi, dword ptr [ebp+12]
- xor ebx, ebx
- loop_23:
- mov ax, [esi+ecx]
- ;--- TABのチェック ---
- cmp al, TAB
- je tab_rtn_3
- ;--- CR・LFのチェック ---
- cmp ax, CRLF
- je crlf_rtn_3
- ;--- 1バイト目の漢字のチェック ---
- and eax, 0ffh
- mov al, chk_tbl_1+eax
- jmp short [offset jmp_tbl_5+eax*4]
- ;--- ANK文字表示 ---
- ank_ok_3:
- mov al, [esi+ecx]
- call put_ank
- inc ebx
- inc ecx
- jmp_23:
- ;--- 1行の文字数チェック ---
- cmp ebx, max_str
- jb short loop_23
- jmp_21:
- pop es
- pop esi
- pop edi
- pop ebx
- pop ebp
- ret
- ;--- 2バイト目の漢字のチェック ---
- chk_kan_3:
- mov al, [esi+ecx+1]
- mov al, chk_tbl_2+eax
- jmp short [offset jmp_tbl_6+eax*4]
- ;--- 漢字表示 ---
- kan_ok_3:
- ;--- 表示数チェック ---
- mov eax, max_str
- dec eax
- cmp ebx, eax
- jae short jmp_21
- mov ax, word ptr [esi+ecx]
- call put_kan
- add ebx, 2
- add ecx, 2
- jmp jmp_23
- ;--- TAB処理 ---
- tab_rtn_3:
- mov eax, ebx
- and eax, tab_wide
- add ebx, add_ebx+eax*4
- add edi, add_edi+eax*4
- inc ecx
- jmp jmp_23
- ;--- CRLF処理 ---
- crlf_rtn_3:
- cmp cr_disp, OFF
- je jmp_21
- ;--- check letter length
- mov eax, max_str
- dec eax
- cmp ebx, eax
- jae jmp_21
- ;--- put CR mark
- mov eax, 0ab81h
- call put_cr_mark
- jmp jmp_21
- put_back_words endp
- ;----------------------------------------------------------
- ; put ↓ mark procedure
- ;----------------------------------------------------------
- put_cr_mark proc
- push ecx
- push esi
- mov esi, offset cr_mark
- mov ecx, 12
- lp_pc0:
- lodsd
- stosd
- lodsw
- stosw
- add edi, VRAM_OFF-6
- and edi, 3ffffh
- loop short lp_pc0
- pop esi
- pop ecx
- ret
- put_cr_mark endp
- ;----------------------------------------------------------
- ; void vsync( void );
- ;----------------------------------------------------------
- public vsync
- db 'vsync', 5
- vsync proc near
- mov dx, 0440h
- mov al, 30
- out dx, al
- mov dx, 0443h
- loop_18:
- align 4
- in al, dx
- and al, 04h
- je short loop_18
- ret
- vsync endp
- ;----------------------------------------------------------
- ; void hsync( int loop );
- ;----------------------------------------------------------
- public hsync
- db 'hsync', 5
- hsync proc
- push ebp
- mov ebp, esp
- mov ecx, [ebp+8]
- lp_hs2:
- mov dx, 440h
- mov al, 30
- out dx, al
- mov dx, 443h
- lp_hs0:
- align 4
- in al, dx
- and al, 2
- jne short lp_hs0
- lp_hs1:
- align 4
- in al, dx
- and al, 2
- je short lp_hs1
- loop short lp_hs2
- pop ebp
- ret
- hsync endp
- ;----------------------------------------------------------
- ; crtc( char adress, short data );
- ;----------------------------------------------------------
- public crtc
- db 'crtc', 4
- crtc proc near
- push ebp
- mov ebp, esp
- mov dx, 440h
- mov al, [ebp+8]
- out dx, ax
- mov dx, 442h
- mov ax, [ebp+12]
- out dx, ax
- pop ebp
- ret
- crtc endp
- ;------------------------------------------------------------------------------
- ; void up_scroll( int offset_adress, int *new_offset_address, int speed );
- ;------------------------------------------------------------------------------
- align 4
- public up_scroll
- db 'up_scroll', 9
- up_scroll proc near
- push ebp
- mov ebp, esp
- push edi
- push esi
- push es
- ;--- スクロールラインを転送する ---
- mov eax, dword ptr [ebp+8]
- and eax, 0ffffff80h
- shl eax, 2
- mov esi, eax
- mov edi, eax
- add esi, r_line
- add edi, 512*480
- and edi, 03ffffh
- and esi, 03ffffh
- mov ecx, l_count_1
- push ds
- mov ax, VRAM_SEL
- mov ds, ax
- mov es, ax
- cld
- rep movsd
- pop ds
- ;--- オフセットアドレスを増やしてスクロール ---
- mov eax, dword ptr [ebp+8]
- add eax, 128
- and eax, 0ffffh
- mov esi, dword ptr [ebp+12]
- mov [esi], eax
- mov dx, 0440h
- mov al, 17
- out dx, al
- mov eax, dword ptr [esi]
- mov dx, 0442h
- out dx, ax
- ;--- ウェイト ---
- mov ecx, dword ptr [ebp+16]
- jecxz short out_1
- mov dx, 0440h
- mov al, 30
- out dx, al
- mov dx, 0443h
- loop_X:
- align 4
- in al, dx
- and al, 02h
- je loop_X
- in al, dx
- and al, 02h
- jne loop_X
- loop short loop_X
- out_1:
- pop es
- pop esi
- pop edi
- pop ebp
- ret
- up_scroll endp
- ;--------------------------------------------------------------------------
- ; void down_scroll( int offset_adress, int *new_offset_address, int );
- ;--------------------------------------------------------------------------
- align 4
- public down_scroll
- db 'down_scroll', 11
- down_scroll proc near
- push ebp
- mov ebp, esp
- push edi
- push esi
- push es
- ;--- スクロールラインを転送する ---
- mov eax, dword ptr [ebp+8]
- and eax, 0ffffff80h
- shl eax, 2
- mov esi, eax
- mov edi, eax
- add esi, 512*479
- add edi, 512*511
- add edi, r_line
- and edi, 03ffffh
- and esi, 03ffffh
- mov ecx, l_count_1
- push ds
- mov ax, VRAM_SEL
- mov ds, ax
- mov es, ax
- cld
- rep movsd
- pop ds
- ;--- オフセットアドレスを減らしてスクロール ---
- mov eax, dword ptr [ebp+8]
- sbb eax, 128
- and eax, 0ffffh
- mov esi, dword ptr [ebp+12]
- mov [esi], eax
- mov dx, 0440h
- mov al, 17
- out dx, al
- mov eax, dword ptr [esi]
- mov dx, 0442h
- out dx, ax
- ;--- ウェイト ---
- mov ecx, dword ptr [ebp+16]
- jecxz short out_2
- mov dx, 0440h
- mov al, 30
- out dx, al
- mov dx, 0443h
- loop_Y:
- align 4
- in al, dx
- and al, 02h
- je loop_Y
- in al, dx
- and al, 02h
- jne loop_Y
- loop short loop_Y
- out_2:
- pop es
- pop esi
- pop edi
- pop ebp
- ret
- down_scroll endp
- ;--------------------------------
- ; put ank font
- ; Use esi : font pattern adress
- ; ecx, edx : calclation
- ;--------------------------------
- align 4
- put_ank proc near
- push ebx
- push ecx
- push edx
- push esi
- mov ebx, eax
- shl eax, 3
- shl ebx, 2
- add eax, ebx
- mov esi, dword ptr [ebp+8]
- add esi, eax
- REPT 12
- lodsb
- mov ecx, eax
- and ecx, 0f0h
- shr ecx, 4
- mov edx, eax
- and edx, 0ch
- mov eax, [offset fnt_ank+ecx*2]
- stosw
- mov eax, [offset fnt_ank+edx*2]
- stosb
- add edi, VRAM_OFF-3
- and edi, 03ffffh
- endm
- sub edi, 0200h*12-3
- and edi, 03ffffh
- pop esi
- pop edx
- pop ecx
- pop ebx
- ret
- put_ank endp
- ;--------------------------------
- ; put kanji font
- ; Use esi : font pattern adress
- ; ecx, edx : calclation
- ;--------------------------------
- align 4
- put_kan proc near
- push ebx
- push ecx
- push edx
- push esi
- xor ecx, ecx
- mov edx, eax
- ;--- SJIS to JIS
- ror dx, 8
- shl dh, 1
- cmp dl, 080h
- adc dx, 1f61h
- add dl, 7fh
- jc short c_01
- add dl, 0a2h
- c_01:
- and dh, 7fh
- cmp edx, 000004f54h
- jb short c_02
- mov edx, 02223h
- c_02:
- mov eax, edx
- sub eax, 000002121h
- shr eax, 8
- mov eax, [offset off_adr_tbl+eax*4]
- and edx, 0000000ffh
- sub edx, 000000021h
- add eax, edx
- mov ebx, eax
- shl eax, 4
- shl ebx, 3
- add eax, ebx
- mov esi, dword ptr [ebp+8]
- add esi, eax
- REPT 12
- lodsw
- mov cl, al
- mov dl, ah
- mov eax, [offset fnt_kan+ecx*4]
- stosd
- mov eax, [offset fnt_kan+edx*4]
- stosw
- add edi, VRAM_OFF-6
- and edi, 03ffffh
- endm
- sub edi, 0200h*12-6
- and edi, 03ffffh
- pop esi
- pop edx
- pop ecx
- pop ebx
- ret
- put_kan endp
- code ends
- end
-